Terraform CloudのWorkspaceに設定できる変数(Variables)の種別terraformとenvの違いを調べてみる
「Terraform CloudのVariablesのcategoly terraformとenvironmentでどう違うの?」
Terraform CloudのWorkspaceには変数を設定することができます。
その際に、変数の選択できるカテゴリはEnvironment varialbe
とTerraform variable
があります。
初めてみた時にどう使い分けたらいいのか、疑問に思ったことがあったので違いをまとめてみます。
ざっくりまとめは以下です。
- Terraform variable:
- Terraformコードのvariableに渡す
- Environment variable
- WorkspaceのVM上に環境変数に値を渡す(ex. AWS IAMアクセスキー)
Environment variable
Terraform CloudではRunのタイミングでVMが立ち上がり、そのVM上でterraform plan
やterraform apply
が実行されます。
AWS・Google Cloud・Azureなどにリソースをデプロイしたい場合、このVM上にクラウドプロパイダーの認証情報を設定する必要があります。 (AWSであれば、IAMアクセスキーやIAMロールなど)
そんな時にEnvironment varialbeを使います。
例えば、以下のようにAWSの認証情報をWorkspaceのEnvironment varialbe
として設定したとします。
上記の設定をすることでVM上で以下のコマンドが実行され、AWSリソースの操作が可能になります。
$ export TFC_AWS_PROVIDER_AUTH=true $ export TFC_AWS_RUN_ROLE_ARN=arn:aws:iam::[AWSアカウントID]:role/tfc-role
今回はAWS認証情報を例に上げましたが、Terraformに関する環境変数を設定する際も同様です。
例えば、TF_LOG=true
を設定してデバックログを出力した場合もEnvironment varialbe
を使います。
Terraformで使用できる環境変数は以下が参考になります。
Environment Variables | Terraform | HashiCorp Developer
Terraform variable
Terraform varialbe
ではTerraformコード上のvarialbe
に対して、値を渡したい時に使用できます。
例えば、以下のようにvarialbe
が定義されていたとします。
variable "instance_type" { description = "Type of EC2 instance to use" default = "t2.micro" type = string } variable "tags" { description = "Tags for instances" type = map default = {} }
WorkspaceのVariableに以下を設定します。
Terraform varialbe
で特徴的なのは、通常の文字列の他にHCLで値を渡すこともできる点です。
varialbe "tags"
はmap
型です。Terraform varialbe
では{ "Name"="test"}
といった形で値を渡すことができます。
Planの結果を確認すると、設定した値が使用されていることがわかります。
Tips: Environment varialbeのTF_VAR_nameとTerraform varialble
Terraform varialbe
ではTerraformコード上のvarialbe
に対して、値を渡すことができると書きました。
実は、Environment variable
でも実現可能です。
TerraformではTF_VAR_name
を環境変数に設定することで、Terraformコード上のvarialbe
に値を渡すことができます。
例えば以下のように、環境変数を設定するとterraformコード上のinstance_type
にt3.medium
を渡せます。
$ export TF_VAR_instance_type=t3.medium
Terraform Cloud上で設定する場合、以下になります。
このようにTF_VAR_nameでも設定できますが、Terraformコード上のvarialbe
に渡したいときはTerraform variable
を使う方が良いと思います。
理由は以下です。
- HCLを使用できる
- 接頭辞TF_VAR_を書かなくてよい
- どちらも設定していた場合は、
Terraform variable
が優先される
1つ目は、HCLが使える点です。タグのようにkey valueで渡したい時に一つの変数で済みます。 また、TF_VAR_を毎回書かなくていいので記述が楽です。
最後に、Terraform CloudのWorkspaceのVariableでどちらも設定していた場合は、Terraform variable
が優先されるためです。
注意点としては、Terraform CloudをCLIで使っていてローカルでTF_VAR
で環境変数を設定した場合はそちらが優先されます。
優先順位の詳細は以下の公式ドキュメントをご確認ください。
Workspace Variables - Terraform Cloud | Terraform | HashiCorp Developer
ただ、機密情報を渡したい場合は、Environment Varialbe
を使う必要があります。
Environment Variable
で渡すことで、stateファイルに値が残らないためです。
Managing Variables - Terraform Cloud | Terraform | HashiCorp Developer
おわりに
Terraform CloudのVaribleの種類と違いについてでした。
初めて使う時に一瞬疑問に思う部分かと思います。誰かの参考になれば嬉しいです。
以上、AWS事業本部の佐藤(@chari7311)でした。